Set DT_SONAME when building dylibs
authorAngus Lees <gus@debian.org>
Thu, 14 Jul 2022 11:17:39 +0000 (13:17 +0200)
committerFabian Grünbichler <debian@fabian.gruenbichler.email>
Fri, 26 Dec 2025 19:54:51 +0000 (20:54 +0100)
commita6c73e2d55527a3dfd082655dc993e25993320d4
tree38a41b1b800bd221b43eccfee1f15dff9e2ca54e
parentad0ece1f06c350706db95d61e42634c86884808c
Set DT_SONAME when building dylibs

In Rust, library filenames include a version-specific hash to help
the run-time linker find the correct version.  Unlike in C/C++, the
compiler looks for all libraries matching a glob that ignores the
hash and reads embedded metadata to work out versions, etc.

The upshot is that there is no need for the usual "libfoo.so ->
libfoo-1.2.3.so" symlink common with C/C++ when building with Rust,
and no need to communicate an alternate filename to use at run-time
vs compile time.  If linking to a Rust dylib from C/C++ however, a
"libfoo.so -> libfoo-$hash.so" symlink may well be useful and in
this case DT_SONAME=libfoo-$hash.so would be required.  More
mundanely, various tools (eg: dpkg-shlibdeps) complain if they don't
find DT_SONAME on shared libraries in public directories.

This patch passes -Wl,-soname=$outfile when building dylibs (and
using a GNU linker).

Forwarded: no

Gbp-Pq: Topic behaviour
Gbp-Pq: Name d-rustc-add-soname.patch
compiler/rustc_codegen_ssa/src/back/link.rs
tests/run-make/dylib-soname/rmake.rs